<?php

class Workset_Controller_Action_Helper_ImageUri extends Workset_Controller_Action_Helper_HttpUri {
	/**
	 * Получение URI для отображения изображения, приведённого к нужным параметрам.
	 * 
	 * @param string $uri  Путь к изображению относительно DOCUMENT_ROOT.
	 * @param integer $width OPTIONAL  Ширина области, в которую вписывается изображение.
	 * @param integer $height OPTIONAL  Высота области, в которую вписывается изображение.
	 * @param integer $sharp OPTIONAL  Включение резкости и задание уровня этой резкости. 
	 * @param integer $crop OPTIONAL  Флаг отрезания части изображения для его полного вписания в заданную область.
	 * @param string $filter OPTIONAL  Накладываемые фильтры.
	 * @param string $logo OPTIONAL  Путь к логотипу, который будет наложен на изображение.
	 * @param string $lpos OPTIONAL  Тип расположения логотипа: "chess", "left-top", "left-bottom", "right-top", "right-bottom", "left", "right", "top", "bottom".
	 * @param string $format OPTIONAL  Формат итогового изображения.
	 * @param integer $quality OPTIONAL  Процент качества JPEG изображения.
	 */
	function direct($uri, $width = null, $height = null, $sharp = null, $crop = null, $filter = null, $logo = null, $lpos = null, $format = null, $quality = null) {
		if (is_array($width))
		{
			$options = $width;

			foreach (array('width','height','sharp','crop','filter','logo','format','quality') as $name)
			{
				$$name = isset($options[$name]) ? $options[$name] : null;
			}
		}

		$params = array();
		isset($width) && (string)$width === (string)abs((int)$width) && $params['width'] = $width;
		isset($height) && (string)$height === (string)abs((int)$height) && $params['height'] = $height;
		isset($sharp) && (-1 != $sharp = ($sharp === true) ? 20 : max(0, intval($sharp))) && $sharp != 20 && $params['sharp'] = $sharp;
		isset($crop) && ($crop = max(0, min(intval($crop), 5))) && $params['crop'] = $crop;
		isset($format) && in_array($format, array('jpeg','png')) && $params['format'] = $format;
		isset($quality) && ($format == 'jpeg' || !isset($format)) && (string)$quality === (string)abs((int)$quality) && intval($quality) <= 100 && $params['quality'] = $quality;
		isset($filter) && $params['filter'] = array_intersect((array)$filter, array('grayscale'));

		if (isset($logo) && $logo = (array)$logo)
		{
			$lpos = isset($lpos) ? (array)$lpos : array();
			$lpar = array(0 => "chess", 1 => "center", 2 => "left-top", 3 => "left-bottom", 4 => "right-top", 5 => "right-bottom", 6 => "left", 7 => "right", 8 => "top", 9 => "bottom");
			$keys = array_unique(array_merge(array_keys($logo), array_keys($lpos)));

			foreach ($keys as $key)
			{
				$value = isset($logo[$key]) ? $logo[$key] : reset($logo);
				$lposnum = (int)array_search(isset($lpos[$key]) ? $lpos[$key] : reset($lpos), $lpar);
				$params['logo'][] = $lposnum.','.ltrim($value,'/');
			}
		}

		if (!empty($params['width']) || !empty($params['height']))
		{
			$params['size'] = (empty($params['width']) ? '0' : $params['width'])
				.'x'.(empty($params['height']) ? '0' : $params['height']);
			unset($params['width']);
			unset($params['height']);
		}

		if (isset($params['logo']) && count($params['logo']) == 1)
		{
			$params['logo'] = reset($params['logo']);
		}

		ksort($params);

		$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
		$secret = $bootstrap->getOption('secret_word');
		$imgHosts = $bootstrap->getOption('img_hosts');

        if (is_array($uri)) {
            if (isset($uri['shortpath'])) {
                $uri = $uri['shortpath'];
            } else {
                throw new Zend_Exception('Wrong type of URI');
            }
        }

        $uri = ltrim($uri, '\/').(count($params) ? '?'.http_build_query($params) : '');

		$host = !empty($imgHosts) && is_array($imgHosts)
			? 'http://'.$imgHosts[ abs(crc32($uri)) % count($imgHosts) ]
			: '';
		return parent::direct("$host/img/".md5($uri.$secret).'/'.$uri, null);
    }
}
?>